package com.muyu.vehicle.utils;

import cn.hutool.core.util.HashUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;


// 使用@Aspect注解声明该类为一个切面类
@Aspect
// 使用@Component注解将该类标记为一个Spring组件，使其能够被Spring容器管理
@Component
// 使用@Slf4j注解为该类添加日志功能
@Slf4j
public class ElkLogsAspect {

    // 使用@Autowired注解自动注入StringRedisTemplate对象，用于操作Redis
    @Autowired
    private StringRedisTemplate redisTemplate;

    // 使用@Pointcut注解定义一个切入点，匹配所有使用了com.ruoyi.qacc.utils.ElkLogs注解的方法
    @Pointcut("@annotation(com.muyu.vehicle.utils.ElkLogs)")
    // 定义切入点方法，方法体为空
    public void ElkLogs() {}

    // 使用@Around注解定义一个环绕通知，在切入点方法执行前后进行增强处理
    @Around(value = "ElkLogs()")
    // 定义环绕通知的方法，参数为ProceedingJoinPoint对象，用于获取连接点信息并执行目标方法
    public Object checkRepeatSubmit(ProceedingJoinPoint jp) throws Throwable {
        // 获取方法名
        String methodName = jp.getSignature().getName();
        // 获取入参
        Object[] args = jp.getArgs();
        String argsJson = JSONUtil.toJsonStr(args);

        log.info("方法 {} 开始执行，入参为: {}", methodName, argsJson);

        Object result = null;
        try {
            // 执行目标方法
            result = jp.proceed();
            log.info("方法 {} 执行成功，执行结果为: {}", methodName, JSONUtil.toJsonStr(result));
        } catch (Throwable e) {
            log.error("方法 {} 执行失败，异常信息: {}", methodName, e.getMessage(), e);
            throw e;
        }
        return result;
    }
}
